同一配方中的多视图
本指南演示如何在不切换到其他配方的情况下,设置一个配方以检查不同部件、角度或视图。
有多种原因需要这样做,但主要有两种使用场景:
- 捕获之间的时间不足以切换配方时,
- 当对同一部件的多个部位或角度执行相同的检测时(例如,在车身的五个不同位置上检测螺柱的存在/不存在)。在这种情况下,该方法可避免在不同配方中对同一模型(螺柱存在/不存在)重复训练多次。
以下示例是一个简单版本,只有两个视图和一种检测类型,但你可以将此同样的技术应用于无限数量的检测类型和视图。在此检测中,我们将检查钻头盒两侧位的存在/不存在。 一侧底部有五个位,另一侧顶部和底部各有八个位。我们将具有 16 位的一侧称为侧 A,具有五位的一侧称为侧 B。
![]() | ![]() |
|---|---|
| 侧 A (16 位) | 侧 B (5 位) |
创建并训练一个新配方
与每面各自一个配方不同,由于布局不同,我们将把两侧合并到一个配方中,这样就不需要对同一存在/不存在模型进行两次训练。
-
创建一个新配方。在这种情况下,这是一个分类配方,但同样的原理也可用于 segmentation(分割)。
-
为第一视图设置模板图像和对齐:
在同一配方上检查多视图时,Aligner(对齐器)不可用。模板图像和对齐器仅用于为 Inspect 设置基准图像。

- 为侧 A 绘制 ROI。给它们命名,以便识别所属侧。在本例中,我们将 ROI 命名为 A1-A16。

- 返回模板图像与对齐,使用侧 B 的图像替换当前图像,可以来自新捕获或库中。

- 使用每个 ROI 旁边的锁定图标,避免移动侧 A 的 ROI;然后为侧 B 绘制并命名 ROI。

对于更复杂的配方,请按需重复此过程,以检测更多不同的视图。
- 使用来自侧 A 和侧 B 的图像对分类模型进行标注与训练。在捕获并标注侧 A 时,请不要标注侧 B 的 ROI,反之亦然。
![]() | ![]() |
|---|---|
| 为侧 A 标注(通过) | 为侧 A 标注(失败) |
![]() | ![]() |
| 为侧 B 标注(通过) | 为侧 B 标注(失败) |
配置 Node-RED 逻辑
-
转到 IO Block(来自 Recipe Editor 的 Configure IO)以打开您的 Node-RED flow。
-
创建一个源,用于告诉 OV80i 当前正在检测哪一侧。
这可以是机器人位置数据、来自 PLC 的信息,或你想使用的任何其他信息。在下方示例中,我们将使用两个 Inject nodes 来模拟:一个发送字符串 "A",另一个发送字符串 "B"。
- 由于输入的侧边数据可能是瞬时的,但我们需要检查哪个侧边处于活动状态,我们将使用一个 Flow variable 来存储状态数据,该数据将持续直到接收到下一条侧边信息。将数据源连接到包含以下代码的函数块:
flow.set('side',msg.payload);
return msg;

- 您可以通过打开 context 数据侧边栏,发送消息,然后在 Flow variable pane 上点击小的 refresh 按钮来测试侧边数据是否已正确存储。Flow 数据窗格只有在手动刷新时才会更新,使用小型的 refresh 按钮。

- 一旦在 Flow variable 中正确存储了侧边数据,添加一个连接到 All Block Outputs 的 switch node。这将是根据 Flow variable 中活动的侧边来路由带有检测数据的消息的节点。将其配置为读取 Flow variable,并在 A 活动时将消息路由到端口 1,B 活动时路由到端口 2。

对于更复杂的配方,可以对你希望检测的不同视图重复此过程,直到覆盖所需的视图数量。
- 将 switch 的每个输出端口连接到一个 Classification Block Logic block,并根据你想要在该侧检测的规则进行配置。开关节点一次只会将消息路由到其中一个节点。下图显示了 switch 的 B-side 端口的配置。请注意,它没有引用 A ROI 的任一区域,因此当检测通过此节点路由时,逻辑将忽略该侧的结果。

- 最后,将 logic blocks 连接到 Inspection Pass/Fail block。这使得结果可以在 HMI 上显示,并被传递给任何连接的 PLC 或其他 flow 组件。

测试配方
现在 Node-RED flow 已配置完成,是时候对配方进行端到端测试了。
- 首先,我们将使用 Node-RED 的 inject 节点发送 A-side 指令。然后使用 HMI 对一个良品进行检测。请注意,尽管 B-side 区域中的一个区域失败,整个检测仍通过。

- 现在,当我们在 A-side 移除钻头并再次检测时,我们得到我们想要的失败结果。

- 接着切换到 B-side 的良品,我们使用 Node-RED 的 inject 发送 B 信号,并在 context 数据窗格的 Flow variable 区段执行 refresh,以确保它已存储。

- 现在切换到良品的 B-side 时,尽管 A-side 区域全部失败,检测仍然通过。

恭喜!您现在知道如何在同一个配方和模型下跨多个视图对部件进行检测。这将实现高速度下的复杂检测,并与机器人实现紧密集成。它也将大幅节省时间,避免为不同视图重复训练多个执行同一检测的模型。





